﻿using System.Collections.Generic;
using System.ServiceModel;
using CPETwit.Data.Entity;

namespace CPETwit.Web.Service.Interface
{
    [ServiceContract]
    public interface ITwitterService
    {
        #region Tweet

        /// <summary>
        /// Recherche de tous les tweets par Tag.
        /// </summary>
        /// <param name="tag"></param>
        /// <returns></returns>
        [OperationContract]
        IEnumerable<Tweet> GetAllTweetsByTag(string tag);

        /// <summary>
        /// Recherche de tous les tweets par texte. La recherche s'effectue sur le contenu
        /// du message du tweet.
        /// </summary>
        /// <param name="texte"></param>
        /// <returns></returns>
        [OperationContract]
        IEnumerable<Tweet> GetAllTweetsByText(string texte);

        /// <summary>
        /// Recherche des derniers tweets pour un utilisateur.
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        [OperationContract]
        IEnumerable<Tweet> GetUserTimeline(User user);

        [OperationContract]
        IEnumerable<Tweet> GetAllTweetsByUserId(long id);

        [OperationContract]
        void SaveTweet(User user, string message, bool tweetOnTwitter);

        [OperationContract]
        void ReTweet(User user, Tweet tweet, bool tweetOnTwitter);

        [OperationContract]
        void UndoReTweet(User user, Tweet tweet);

        [OperationContract]
        IEnumerable<Tweet> getTweetFromId(long id);
        
        [OperationContract]
        IEnumerable<Tweet> getAllTweetsFromLoginOrMessage(string texte);

        #endregion

        #region User

        /// <summary>
        /// Recherche un utilisateur par son login.
        /// </summary>
        /// <param name="login"></param>
        /// <returns></returns>
        [OperationContract]
        User GetUser(string login);

        [OperationContract]
        IEnumerable<User> GetUsersByText(string text);

        /// <summary>
        /// Indique si l'email en paramètre est valide (=non utilisé)
        /// </summary>
        /// <param name="email"></param>
        /// <returns></returns>
        [OperationContract]
        bool IsEmailValid(string email);

        /// <summary>
        /// Indique si le pseudo en paramètre est valide (=non utilisé)
        /// </summary>
        /// <param name="userName"></param>
        /// <returns></returns>
        [OperationContract]
        bool IsUserNameValid(string userName);

        /// <summary>
        /// Recherche les personnes qui se sont abonnées à un utilisateur.
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        [OperationContract]
        IEnumerable<User> GetFollowers(User user);

        [OperationContract]
        IEnumerable<User> GetUnFollowers(User user);

        /// <summary>
        /// Recherche les personnes auquelles un utilisateur est abonné.
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        [OperationContract]
        IEnumerable<User> GetPublishers(User user);

        [OperationContract]
        IEnumerable<User> GetUnPublishers(User user);

        /// <summary>
        /// Création d'un utilisateur.
        /// </summary>
        /// <param name="login"></param>
        /// <param name="password"></param>
        /// <param name="email"> </param>
        /// <returns></returns>
        [OperationContract]
        User CreateUser(string login, string password, string email);

        /// <summary>
        /// Suppression d'un utilisateur.
        /// </summary>
        /// <param name="login"></param>
        /// <param name="password"></param>
        /// <returns></returns>
        [OperationContract]
        bool DeleteUser(string login, string password);
       
        /// <summary>
        /// Mise à jour de l'utilisateur;
        /// </summary>
        /// <param name="u"></param>
        [OperationContract]
        void UpdateUser(User u);

        [OperationContract]
        IEnumerable<User> GetTweetOwner(Tweet t);

        [OperationContract]
        IEnumerable<User> RechercheUser(Dictionary<string, string> filtres);

        [OperationContract]
        void Follow(User follower, User publisher);

        [OperationContract]
        void Unfollow(User follower, User publisher);

        #endregion
    }
}
